<?php

/**
 * Created by Sven.
 * Date: 2016/12/16
 * Time: 10:48
 * 模板类
 */
class Templates {

    // 模板变量数组
    private $_vars = array();
    // 系统变量数组
    private $_configs = array();

    public function __construct() {
        if (!is_dir(TPL_DIR) || !is_dir(TPL_C_DIR) || !is_dir(CACHE_DIR)){
            exit('ERROF: 模板目录 or 模板编译目录 or 缓存文件目录没有创建，请手动创建!');
        }
//        var_dump(!is_dir(TPL_DIR));
//        var_dump(!is_dir(TPL_C_DIR));
//        var_dump(!is_dir(CACHE_DIR));

        // 解析系统配置
        $this->parseProfile();

    }

    // 解析系统配置
    private function parseProfile() {
        $_sxe = simplexml_load_file( ROOT_PATH . '/config/profile.xml' );
        $_taglib = $_sxe->xpath('/root/taglib');
        foreach ($_taglib as $taglib){
            $this->_configs[$taglib->name.'']  = $taglib->value.''; // $taglib->name 是对象，需要转换字符串
        }
    }

    public function assign($_key, $_val){
        // 判断变量名是否合法
        if ( isset($_key) && !empty($_key) ){
            $this->_vars[$_key] = $_val;
        } else {
            exit('ERROR: 非法的模板变量名');
        }
    }

    public function cache($_file = ''){

        // 判断是否开启了缓存机制
        if (IS_CACHE){

        // 判断参数是否合法
        if (empty($_file)){
            exit('ERROR: 模板文件名不合法，请检查!');
        }

        $_tplFile = TPL_DIR.$_file;

        // 判断模板文件是否存在
        if (!file_exists($_tplFile)){
            exit('模板文件不存在');
        }

        // 生成编译文件名
        $_parFile = TPL_C_DIR.md5($_file).$_file;
        // 生成缓存文件名
        // 加上参数
        $_extra =  $_SERVER['REQUEST_URI'];
        $_cacheFile =CACHE_DIR.md5($_file.$_extra).'.html';

            // 判断缓存文件和编译文件是否同时存在
            if (file_exists($_cacheFile) && file_exists($_parFile)){
                // 判断模板文件没有被修改过，判断编译文件没有被修改过
                if (filemtime($_parFile) >= filemtime($_tplFile) && filemtime($_cacheFile) >= filemtime($_parFile)){
                    include $_cacheFile;
                    // 这里必须exit，阻止后续php代码执行
                    exit;
                }
            }
        }
    }


    /**
     * 解析模板文件
     * @param string $_file 模板文件
     * 含缓存
     * 使用示例：
     *  $_tpl->diaplay('admin.tpl');
     */
    public function display($_file = ''){

        // 判断参数是否合法
        if (empty($_file)){
            exit('ERROR: 模板文件名不合法，请检查!');
        }

        $_tplFile = TPL_DIR.$_file;

        // 判断模板文件是否存在
        if (!file_exists($_tplFile)){
            exit('模板文件不存在');
        }

        // 生成编译文件名
        $_parFile = TPL_C_DIR.md5($_file).$_file;
        // 生成缓存文件名
        // 加上参数
        $_extra =  $_SERVER['REQUEST_URI'];
        $_cacheFile =CACHE_DIR.md5($_file.$_extra).'.html';


        // 判断是否为debug模式
        if (DEBUG){
//            require INCLUDE_DIR.'Parser.class.php';
            // 避免header.inc.php  footer.inc.php 重复包含
//            require_once 'Parser.class.php';
            $_parser = new Parser($_tplFile);
            $_parser->compile($_parFile);
        } else {
            // 编译文件生成条件：不存在 or 模板文件已经被修改
            if (!file_exists($_parFile)  || filemtime($_tplFile) > filemtime($_parFile) ){
//            echo '生成了编译文件';
//                require_once 'Parser.class.php';
                $_parser = new Parser($_tplFile);
                $_parser->compile($_parFile);
            }
        }

//        $this->outVars();
//        $this->outConfigs();

        // 输出了编译文件的内容
        include $_parFile;

        // 判断是否开启了缓存机制
        if (IS_CACHE){
            // 将输出内容保存到缓存文件
            file_put_contents($_cacheFile, ob_get_contents());
        }

    }

    /**
     * 解析模板文件
     * @param string $_file 模板文件
     * 不含缓存
     * 使用示例：
     *  $_tpl->create('admin.tpl');
     */
    public function create($_file = ''){
        // 判断参数是否合法
        if (empty($_file)){
            exit('ERROR: 模板文件名不合法，请检查!');
        }

        $_tplFile = TPL_DIR.$_file;

        // 判断模板文件是否存在
        if (!file_exists($_tplFile)){
            exit('模板文件不存在');
        }

        // 生成编译文件名
        $_parFile = TPL_C_DIR.md5($_file).$_file;

        if (!file_exists($_parFile)  || filemtime($_tplFile) > filemtime($_parFile) ){
//            echo '生成了编译文件';
//            require_once 'Parser.class.php';
            $_parser = new Parser($_tplFile);
            $_parser->compile($_parFile);
        }

        // 输出了编译文件的内容
        include $_parFile;
    }

    private function outVars(){
        echo '<pre>';
        print_r($this->_vars);
        echo '</pre>';

    }

    private function outConfigs() {
        echo '<pre>';
        print_r($this->_configs);
        echo '</pre>';
    }


}